#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>

void sig_child(int signo) // 信号处理函数
{
  pid_t pid;
  int stat;
  while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) // 非阻塞
  {
    printf("child %d terminated\n", pid);
  }
  return;
}

int main()
{
  pid_t pid;
  int i;
  // 先屏蔽信号
  sigset_t set, oldset;
  sigemptyset(&set);
  sigaddset(&set, SIGCHLD);
  sigprocmask(SIG_BLOCK, &set, &oldset);

  for (i = 0; i < 10; i++)
  {
    if ((pid = fork()) == 0)
    {
      break;
    }
  }
  if (i == 10)
  { // 父进程
    // 注册信号处理函数
    sleep(4);
    struct sigaction sa, oldsa;
    sa.sa_handler = sig_child;
    sa.sa_flags = 0;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGCHLD, &sa, &oldsa);

    // 解除信号屏蔽
    sigprocmask(SIG_UNBLOCK, &set, &oldset);
    while (1)
      ;
  }
  else
  {
    printf("child %d\n", getpid());
    exit(0);
  }
  return;
}